/************************************************************************
 * <br>
 * <ul>
 * <li>版权所有：唐山弘川科技有限公司 2009－2020</li>
 * <li>创建日期：2009-8-4</li>
 * <li>初始作者：刘川</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 ***********************************************************************/
package com.hy.enterprise.framework.jpa.core.entity.identifier ;

import java.io.Serializable;

import javax.persistence.Column ;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id ;
import javax.persistence.MappedSuperclass ;
import javax.persistence.Transient;

import org.hibernate.annotations.GenerationTime;

import com.hy.enterprise.framework.jpa.core.entity.util.Identifierable;

/**
 * <ul>
 * <li>设计作者：花宏宇</li>
 * <li>设计日期：2009-8-4</li>
 * <li>设计时间：下午05:56:22</li>
 * <li>设计目的：字符串标识符抽象实现类<br>
 * getId作为主键,<br
 * ><b>对于Myiyo可以可以传递Integer或者Long作为泛型参数，如果传递String的话，则出错</b>
 * </li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 */
@SuppressWarnings("unchecked")
@ MappedSuperclass//是否映射
public abstract class Identifier < T extends Serializable, S extends Serializable > 
{
	private static final long	serialVersionUID	=
	                                                  - 8200144472070383437L ;
	/**
	 * 标识符
	 */
	private T	          id ;
	private S	          identifier ;

	/**
	 * 构造函数
	 */
	public Identifier ( )
	{
		super ( ) ;
	}

	/**
	 * 构造函数
	 * 
	 * @param identifier
	 */
	public Identifier (
	                          T identifier )
	{
		super ( ) ;
		this
		    .setId ( identifier ) ;
	}

	/**
	 * @see com.hy.enterprise.framework.jpa.core.entity.util.Identifierable#getIdentifier()
	 */
	@Id
	@GeneratedValue
	public T getId ( )
	{
		return (T) this.id ;
	}
	
	//@Transient
//	@Column(columnDefinition="unique")
//	@Column(unique=true,columnDefinition="unique")
	@Column(unique=true)
	public S getIdentifier(){
		return (S)this.identifier;
	}

	/**
	 * @see com.hy.enterprise.framework.jpa.core.entity.util.Identifierable#setIdentifier(java.io.Serializable)
	 */
	public void setId (
	                            T id )
	{
		this.id=
		                  id ;
	}
	public void setIdentifier(S identifier){
		this.identifier= identifier;
	}
}
